<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

namespace Agp\CoreBundle\Entity;

use Sylius\Bundle\CartBundle\Entity\Cart as BaseCart;
use Sylius\Bundle\CartBundle\Model\CartInterface;
use Doctrine\Common\Collections\Collection;
use APY\DataGridBundle\Grid\Mapping as GRID;
use Agp\CoreBundle\Entity\FormaPagamento;
use Symfony\Component\Validator\Constraints as Assert;
use Agp\CoreBundle\Entity\ListaPreco;

use Doctrine\ORM\Mapping as ORM;

/**
 * Description of Pedido
 *
 * @author bondcs
 * @ORM\Table(name="pedido")
 * @ORM\Entity(repositoryClass="Agp\CoreBundle\Repository\PedidoRepository")
 * @ORM\HasLifecycleCallbacks
 * 
 * @GRID\Source(groups="agape", groupBy="codPedido", columns="codPedido, pedidoSite.codPedidoSite, pedidoTerminal.codPedidoTerminal, empresa.razaoSocial, evento.info.descricao, formaPagamento.descricao, dtPedido, situacao, pedidoSite.items.subtotal:sum, pedidoTerminal.valor, cartao.titular, pedidoSite.usuario.nome")
 * @GRID\Source(groups="empresa", groupBy="codPedido", columns="codPedido, pedidoSite.codPedidoSite, pedidoTerminal.codPedidoTerminal, evento.info.descricao, formaPagamento.descricao, dtPedido, pedidoSite.items.subtotal:sum, pedidoTerminal.valor")
 */
class Pedido{
    
    /**
     * @var integer $id
     *
     * @ORM\Column(name="cod_pedido", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     * 
     * @GRID\Column(title="Código", type="text", size="5", primary=true, align="center")
     */
    protected $codPedido;
    
    /**
     *
     * @var datetime
     * 
     * @ORM\Column(name="dt_pedido", type="datetime", nullable=false)
     * 
     * @GRID\Column(title="Data de entrada", type="datetime", align="center")
     * 
     */
    protected $dtPedido;
    
    const SIT_PEDIDO_REALIZADO = 1;
    const SIT_PEDIDO_CANCELADO = 2;
    const SIT_ANALIZE_CREDITO = 3;
    const SIT_ANALIZE_APROVADA = 4;
    const SIT_APROVACAO_PGTO = 5;
    const SIT_PGTO_CONFIRMADO = 6;
    
    /**
     *
     * @var string
     * 
     * @ORM\Column(type="string", length=42, nullable=false)
     * 
     * @GRID\Column(groups="agape", visible=false)
     * 
     */
    protected $situacao;
    
    /**
     * @ORM\OneToOne(targetEntity="Agp\CoreBundle\Entity\Cartao", cascade={"all"})
     * @ORM\JoinColumn(name="cod_cartao", referencedColumnName="cod_cartao", onDelete="Cascade", nullable=true)
     * @var object
     * @GRID\Column(field="cartao.titular", title="Nome", type="text")
     */
    protected $cartao;
    
    /**
     * 
     * @ORM\ManyToOne(targetEntity="Agp\CoreBundle\Entity\FormaPagamento", fetch="LAZY")
     * @ORM\JoinColumn(name="cod_forma_pagamento", referencedColumnName="cod_forma_pagamento", nullable=true)
     * 
     * @GRID\Column(size="30", field="formaPagamento.descricao", title="Forma de pagamento", type="text", align="center")
     */
    protected $formaPagamento;
    
    /**
     * 
     * @ORM\ManyToOne(targetEntity="Agp\CoreBundle\Entity\Evento", fetch="LAZY")
     * @ORM\JoinColumn(name="cod_evento", referencedColumnName="cod_evento", nullable=true)
     * 
     * @GRID\Column(field="evento.info.descricao", title="Evento", type="text")
     * @GRID\Column(field="evento.empresa.razaoSocial", title="Empresa", type="text")
     */
    protected $evento;
    
    /**
     * 
     * @ORM\ManyToOne(targetEntity="Agp\CoreBundle\Entity\Empresa", fetch="LAZY")
     * @ORM\JoinColumn(name="cod_empresa", referencedColumnName="cod_empresa", nullable=true)
     * 
     * @GRID\Column(field="empresa.razaoSocial", title="Empresa", type="text")
     */
    protected $empresa;
    
    /**
     * @ORM\OneToOne(targetEntity="Agp\CoreBundle\Entity\RetornoTransacaoRede", cascade={"all"})
     * @ORM\JoinColumn(name="cod_retorno_transacao_rede", referencedColumnName="cod_retorno_transacao_rede", onDelete="Cascade", nullable=true)
     * @var object
     */
    protected $retornoTransacaoRede;
    
    /**
     * @ORM\OneToOne(targetEntity="Agp\CoreBundle\Entity\Retorno3dsCielo", cascade={"all"})
     * @ORM\JoinColumn(name="cod_retorno_3ds_cielo", referencedColumnName="cod_retorno_3ds_cielo", onDelete="Cascade", nullable=true)
     * @var object
     */
    protected $retorno3dsCielo;
    
    /**
     * @ORM\OneToOne(targetEntity="Agp\CoreBundle\Entity\RetornoTransacaoCielo", cascade={"all"})
     * @ORM\JoinColumn(name="cod_retorno_transacao_cielo", referencedColumnName="cod_retorno_transacao_cielo", onDelete="Cascade", nullable=true)
     * @var object
     */
    protected $retornoTransacaoCielo;
    
    /**
     * @ORM\OneToOne(targetEntity="Agp\CoreBundle\Entity\RetornoCancelamentoCielo", cascade={"all"})
     * @ORM\JoinColumn(name="cod_retorno_cancelamento_cielo", referencedColumnName="cod_retorno_cancelamento_cielo", onDelete="Cascade", nullable=true)
     * @var object
     */
    protected $retornoCancelamentoCielo;
    
    /**
     * @ORM\OneToOne(targetEntity="Agp\CoreBundle\Entity\RetornoCancelamentoRede", cascade={"all"})
     * @ORM\JoinColumn(name="cod_retorno_cancelamento_rede", referencedColumnName="cod_retorno_cancelamento_rede", onDelete="Cascade", nullable=true)
     * @var object
     */
    protected $retornoCancelamentoRede;
    
    /**
     *
     * @ORM\Column(name="locked",type="boolean", nullable=false)
     */
    protected $locked;
    
    /**
     *
     * @ORM\OneToMany(targetEntity="Agp\CoreBundle\Entity\Venda", mappedBy="pedido", orphanRemoval=true)
     * 
     */
    protected $vendas;
    
    /**
     * @ORM\OneToOne(targetEntity="PedidoSite", mappedBy="pedido")
     * 
     * @Grid\Column(field="pedidoSite.codPedidoSite", visible=false)
     * @Grid\Column(field="pedidoSite.items.subtotal:sum", align="center", type="number", style="currency", title="Valor")
     * @GRID\Column(field="pedidoSite.usuario.nome", title="Nome", type="text", visible=false)
     */
    private $pedidoSite;
    
    /**
     * @ORM\OneToOne(targetEntity="PedidoTerminal", mappedBy="pedido")
     * 
     * @Grid\Column(field="pedidoTerminal.codPedidoTerminal", visible=false)
     * @Grid\Column(field="pedidoTerminal.valor", visible=false, align="center", type="number", style="currency", title="Valor")
     */
    private $pedidoTerminal;
    
    /**
     *
     * @ORM\Column(name="repassado",type="boolean", nullable=false)
     */
    protected $repassado;
    
    /**
     * 
     * @ORM\ManyToOne(targetEntity="Agp\CoreBundle\Entity\SolicitacaoRepasse", fetch="LAZY", inversedBy="pedidos")
     * @ORM\JoinColumn(name="cod_solicitacao_repasse", referencedColumnName="cod_solicitacao_repasse", nullable=true, onDelete="set null")
     * 
     */
    protected $solicitacaoRepasse;

    public function __construct() {
        $this->situacao = self::SIT_ANALIZE_CREDITO;
        $this->dtPedido = new \DateTime;
        $this->locked = false;
        $this->repassado = false;
    }
    
    public function isLocked(){
        return $this->locked;
    }
    
    public function isTerminal(){
        return ($this->pedidoTerminal != null);
    }
    
    public function getValorTotal(){
        $total = 0;
        foreach ($this->vendas as $v){
            foreach ($v->getItens() as $item){
                $total += $item->getSubtotal();
            }
        }
        return $total;
        
    }
    
    public function getItemsCustom() {
        $itens = array();

        foreach ($this->vendas as $v){
            foreach ($v->getItens() as $i){
                if ($i->getLista()->getTipo() == ListaPreco::TP_PASSAPORTE){
                    $itens[$i->getLista()->getCodListaPreco()] = $i;
                }else{
                    $itens[] = $i;
                }
            }
        }
        
        return $itens;
   }

    public function getSituacaoText($situacao = null){
        
        if ($situacao == null)
            $situacao = $this->situacao;
        
        switch ($situacao){
            case self::SIT_PEDIDO_REALIZADO:
                    return 'Seu pedido foi realizado';
            case self::SIT_ANALIZE_CREDITO:
                    return 'Aguardando análise de crédito';
            case self::SIT_ANALIZE_APROVADA:
                    return 'Análise de Crédito aprovada';
            case self::SIT_APROVACAO_PGTO:
                    return 'Aguardando Aprovação de Pagamento';
            case self::SIT_PGTO_CONFIRMADO:
                    return 'O pagamento de seu pedido foi confirmado';
            case self::SIT_PEDIDO_CANCELADO:
                    return 'Seu pedido foi cancelado';
        }
    }
    
    public function getCodPedido() {
        return $this->codPedido;
    }
    
    public function getCodPedidoWithPad() {
        return str_pad($this->codPedido,4,'0',STR_PAD_LEFT);
    }
    
    public function getDtPedido() {
        return $this->dtPedido;
    }

    public function setDtPedido($dtPedido) {
        $this->dtPedido = $dtPedido;
    }

    public function getSituacao() {
        return $this->situacao;
    }

    public function setSituacao($situacao) {
        $this->situacao = $situacao;
    }

    public static function getSituacaoList(){
        return array(self::SIT_PGTO_CONFIRMADO => 'O pagamento de seu pedido foi confirmado',
                     self::SIT_ANALIZE_CREDITO => 'Aguardando análise de crédito',
                     self::SIT_APROVACAO_PGTO => 'Aguardando Aprovação de Pagamento',
                     self::SIT_PEDIDO_CANCELADO => 'Seu pedido foi cancelado',
                     );
    }
    
    public function getLocked() {
        return $this->locked;
    }

    public function setLocked($locked) {
        $this->locked = $locked;
    }
    
    public function getVendas() {
        return $this->vendas;
    }

    public function setVendas($vendas) {
        $this->vendas = $vendas;
    }
    
    public function getPedidoSite() {
        return $this->pedidoSite;
    }

    public function setPedidoSite($pedidoSite) {
        $this->pedidoSite = $pedidoSite;
    }
    
    public function getCartao() {
        return $this->cartao;
    }

    public function setCartao($cartao) {
        $this->cartao = $cartao;
    }
    
    public function getRetornoCartao(){
        if ($this->formaPagamento->getFiliacao() == FormaPagamento::FI_CIELO){
            return $this->retornoTransacaoCielo;
        }else{
            return $this->retornoTransacaoRede;
        }
    }

    public function getRetornoTransacaoRede() {
        return $this->retornoTransacaoRede;
    }

    public function setRetornoTransacaoRede($retornoTransacaoRede) {
        $this->retornoTransacaoRede = $retornoTransacaoRede;
    }

    public function getRetornoTransacaoCielo() {
        return $this->retornoTransacaoCielo;
    }

    public function setRetornoTransacaoCielo($retornoTransacaoCielo) {
        $this->retornoTransacaoCielo = $retornoTransacaoCielo;
    }
    
    public function getFormaPagamento() {
        return $this->formaPagamento;
    }

    public function setFormaPagamento($formaPagamento) {
        $this->formaPagamento = $formaPagamento;
    }
    
    public function getRetornoCancelamentoCielo() {
        return $this->retornoCancelamentoCielo;
    }

    public function setRetornoCancelamentoCielo($retornoCancelamentoCielo) {
        $this->retornoCancelamentoCielo = $retornoCancelamentoCielo;
    }

    public function getRetornoCancelamentoRede() {
        return $this->retornoCancelamentoRede;
    }

    public function setRetornoCancelamentoRede($retornoCancelamentoRede) {
        $this->retornoCancelamentoRede = $retornoCancelamentoRede;
    }

    public function getPedidoTerminal() {
        return $this->pedidoTerminal;
    }

    public function setPedidoTerminal($pedidoTerminal) {
        $this->pedidoTerminal = $pedidoTerminal;
    }
    
    public function getEvento() {
        return $this->evento;
    }

    public function setEvento($evento) {
        $this->evento = $evento;
    }
    
    public function getEmpresa() {
        return $this->empresa;
    }

    public function setEmpresa($empresa) {
        $this->empresa = $empresa;
    }
    
    public function getRepassado() {
        return $this->repassado;
    }

    public function setRepassado($repassado) {
        $this->repassado = $repassado;
    }
    
    public function getSolicitacaoRepasse() {
        return $this->solicitacaoRepasse;
    }

    public function setSolicitacaoRepasse($solicitacaoRepasse) {
        $this->solicitacaoRepasse = $solicitacaoRepasse;
    }
    
    public function getRetorno3dsCielo() {
        return $this->retorno3dsCielo;
    }

    public function setRetorno3dsCielo($retorno3dsCielo) {
        $this->retorno3dsCielo = $retorno3dsCielo;
    }

}

?>